/*** 本文件由CSMIS2.0-ModelCreater(UTF-8)工具辅助生成，版本1.0 ***/

package com.ce.sys.role.action;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import net.sf.json.JSONArray;

import org.omg.CORBA.portable.ApplicationException;

import com.ce.framework.constants.WebConstants;
import com.ce.framework.datamaintain.action.DataMaintainAction;
import com.ce.framework.datamaintain.logic.ISQLMapper;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.StringUtil;
import com.ce.framework.util.node.JsonTreeNode;
import com.ce.sys.login.model.User;
import com.ce.sys.menu.dao.po.SysMenu;
import com.ce.sys.menu.dao.po.SysMenuOperations;
import com.ce.sys.org.view.OrgTreeNodeProperty;
import com.ce.sys.person.view.SysPersonView;
import com.ce.sys.role.dao.po.SysAccountRole;
import com.ce.sys.role.dao.po.SysRole;
import com.ce.sys.role.logic.IRoleLogic;
import com.ce.util.DbUtil;
import com.ce.util.OrgUtil;
import com.ce.util.TreeNode;

/**
* 嫦娥软件有限公司 版权所有 2013
* 创建人：　andy
* 创建日期：2010-10-25
* 创建时间：09:15:59
* 功能描述：系统角色表 [SYS_T_ROLE]更改时用的Action
* ==============================================
* 修改历史
* 修改人		修改时间		修改原因
*
* ==============================================
*/
public class SysRoleAction extends DataMaintainAction 
{
	private static final long serialVersionUID = 1L;
	
	private IRoleLogic roleLogic ;
	
    public IRoleLogic getRoleLogic() {
		return roleLogic;
	}

	public void setRoleLogic(IRoleLogic roleLogic) {
		this.roleLogic = roleLogic;
	}    
	
	private String menuId;
    
    public String getMenuId() {
		return menuId;
	}

	public void setMenuId(String menuId) {
		this.menuId = menuId;
	}

	@Override
	public String execute() throws Exception {
		if("searchAllMenuJsonTree".equals(op)){
			return searchAllMenuJsonTree();
		}
		else if("openOptListPage".equals(op)){
			return openOptListPage();
		}
		else if("searchAdminUsers".equals(op)){
			return searchAdminUsers();
		}
		else if("viewRelationUser".equals(op)){
			return viewRelationUser();
		}
		else if("relation".equals(op)){
			return relation();
		}
		else if("loadRoleUsers".equals(op)){//加载有角色权限的用户
			return loadRoleUsers();
		}
		return super.execute();
	}

	/**
	 * 加载有角色权限的用户
	 * @return
	 */
	private String loadRoleUsers() {
    	String curMenuId = (String)getAttribute("menuId");
    	String sql = "select u.vc_id,u.vc_name,o.VC_NAME from sys_t_role t,sys_t_role$permiss p,sys_t_person u,sys_t_account$role a,sys_v_org$dep o " +
    			"where o.VC_ID=u.vc_org$id and t.vc_id=a.vc_role$id and a.vc_user$id=u.vc_id and t.vc_id=p.vc_role$id and p.vc_menu$id=? " +
    			"order by o.n_id,o.N_SEQ,u.n_seq,u.vc_name";
    	List<TreeNode> list = DbUtil.executeSqlQuery(sql, TreeNode.mapper3,new Object[]{curMenuId});
    	JSONArray ary = new JSONArray();
    	ary.addAll(list);
		return writeHTML(ary.toString());
	}

	@Override
	public String list() throws AppException {
		String sql = "select a.vc_type,nvl(p.vc_name, '*系统管理员') user_name,decode(p.vc_name,null,0,1) seq from (SELECT t.vc_type FROM SYS_T_ROLE t WHERE t.VC_DEL$FLAG = 0 group by t.vc_type) a, SYS_T_PERSON p where a.vc_type = p.vc_id(+) order by seq,user_name";
		HashMap<Object, Object> list = DbUtil.getMapSqlQuery(sql);
		setAttribute("adminUser", list);
		return super.list();
	}

	@Override
	protected String openAddPage() throws AppException {
		// TODO Auto-generated method stub
		if(User.getUser().isSuperUser()) {
			this.setAttribute("isAdmin", "true");
		}
    	int seq = this.baselogic.getCntByHQL("from SysRole po where po.vcDelFlag = 0 and po.vcType='"+menuId+"'");
    	this.setAttribute("seq", seq);
		return super.openAddPage();
	}

	/**
     * 开发人： andy
     * 开发时间： 2013-10-11 下午01:07:59
     * 功能描述： 构造全部菜单的JSON格式的菜单树
     * 方法的参数和返回值
	 * @return 
     * @throws ApplicationException
     * @throws AppException
     * void 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    public String searchAllMenuJsonTree()throws  AppException{
    	List<?> menuList = new ArrayList<Object>();
    	List<?> roleMenuList = null;
    	JSONArray jsonTree = new JSONArray();
    	String parId = this.getParameter("parId");
    	if(StringUtil.isBlank(this.getParameter("parId")))
    		throw new AppException("MenuTree's rootNode is not exit! ");
    /**原代码
//    	String baseSql = "select * from sys_t_menu t ";  //获取机构树的基本sql语句
//    	//是超级管理员时加载所有菜单，否则只加载系统管理员菜单
//		if(!User.getUser().isSuperUser())
//			baseSql = baseSql + " where (t.int_level =1 or t.vc_id in (select t2.vc_menu$id from sys_t_role$permiss t2 where t2.vc_role$id ='admin'))";
//		baseSql = baseSql + " start with t.vc_par$id = '0' connect by PRIOR t.vc_id = t.vc_par$id ";
//    	
//    	StringBuffer sql  = new StringBuffer("select * from ("+baseSql+") where 1=1 and vc_del$flag=0");
//    	sql.append(" order by INT_SEQ ASC,VC_NAME Asc");
    	**/
    	
    	
    	 //获取所有菜单
    	String allMenuSql = "select * from " +
    			"(select * from sys_t_menu t start with t.vc_par$id = '"+parId+"' connect by PRIOR t.vc_id = t.vc_par$id) " +
    					"where 1=1 and vc_del$flag=0 order by INT_SEQ ASC,VC_NAME Asc";
    	String curMenuId = (String)getAttribute("menuId");
    	//选取当前登录用户所在角色具有权限的菜单	   	
    	String curUserMenuSql = "select * from (select * from (select * from sys_t_menu m where"+(curMenuId!=null?" m.vc_id!='"+curMenuId+"' and":"")+
    			" m.vc_del$flag = 0 and (m.int_level = 1 or " +
    			"m.vc_id in (select p.vc_menu$id from sys_t_role$permiss p where p.vc_role$id = 'admin'))) start with vc_par$id = '"+parId+"' connect by PRIOR vc_id = vc_par$id) t " +
    			"where (t.int_level = 1 or (t.int_level = 0 and t.vc_id in (select p.vc_menu$id from sys_t_role$permiss p where p.vc_role$id in " +
    			"(select r.vc_role$id   from sys_t_account$role r where r.vc_user$id = '"+User.getUser().getVcId()+"')))) order by INT_SEQ ASC, VC_NAME Asc";
    	if(User.getUser().isAdmin())
    		curUserMenuSql = allMenuSql;
    	//将通过SQL语句查询的结果集组合成SysVOrg对象的数组
    	menuList = this.baselogic.executeSQLQuery(curUserMenuSql,new ISQLMapper<Object>(){
			public SysMenu fromSQLQuery(ResultSet rs, int row) {
				SysMenu view = new SysMenu();
				try {
					view.setVcId(rs.getString("VC_ID"));
					view.setVcName(rs.getString("VC_NAME"));
					view.setIntLevel(rs.getInt("INT_LEVEL"));
					view.setIntSeq(rs.getInt("INT_SEQ"));
					view.setVcUrl(rs.getString("VC_URL"));
					view.setVcParId(rs.getString("VC_PAR$ID"));
					view.setVcMemo(rs.getString("VC_MEMO"));
					view.setVcIsMerge(rs.getInt("VC_IS$MERGE"));
					view.setVcLinkUrl(rs.getString("VC_LINK$URL"));
					view.setVcDelFlag(rs.getInt("VC_DEL$FLAG"));
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return view;
			}
		});
    	if(this.getParameter("roleId")!=null){
    		//获取该角色所拥有的叶子节点菜单
    		String hql = "select po.vcMenuId from SysRolePermiss po where po.vcRoleId='"+this.getParameter("roleId")+"'";
    		roleMenuList = this.baselogic.searchByHql(" from SysMenu m where m.vcId in ( "+hql+" ) and m.intLevel=0 and m.vcDelFlag = 0");
    	}
    	List<JsonTreeNode> childList  = this.getChildNodeListForMenu(parId,menuList,roleMenuList);  //获取根节点下的全部节点信息
    	jsonTree.add(childList);  //写入树节点信息
    	//以字符串为文件流进行输出 
		//由于形成的json格式与easyui的格式在外部多了个[]，因此在这里进行移除。
		return writeHTML(jsonTree.toString().subSequence(1, jsonTree.toString().length()-1).toString());  //将树以JSON格式的字符串进行输出
    }
    
    
    /**
     * 开发人： andy
     * 开发时间： 2013-10-11 下午01:08:18
     * 功能描述：获得子菜单树的JSON格式数据
     * 方法的参数和返回值
     * @param pid
     * @param menuList
     * @return
     * List 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    private List<JsonTreeNode> getChildNodeListForMenu(String pid,List<?> menuList,List<?> roleMenuList){
    	List<JsonTreeNode> rootList = new ArrayList<JsonTreeNode>();
    	//循环遍历所有机构
    	for(int i=0;i<menuList.size();i++){
    		SysMenu menu = (SysMenu)menuList.get(i);
    		//判断机构信息，当机构的上级ID和参数pid相同时，才将该机构纳入到子节点中
    		if(pid.equals(menu.getVcParId())){
        		JsonTreeNode child = new JsonTreeNode();
            	child.setId(menu.getVcId());
            	child.setText(menu.getVcName());
            	//判断角色菜单中是否包含当前菜单，包含的话设置勾选状态
            	if(roleMenuList!=null&&roleMenuList.contains(menu))	
            	    child.setChecked(true);
            	else
            		child.setChecked(false);
            	OrgTreeNodeProperty attr = new OrgTreeNodeProperty();
            	attr.setUrl(menu.getVcUrl());
            	child.setAttributes(attr);
            	List<JsonTreeNode> childList = this.getChildNodeListForMenu(menu.getVcId(),menuList,roleMenuList);  //递归获取的该节点的下级节点
            	child.setChildren(childList);
            	
            	if(childList!=null&&childList.size()>0)  //当有子节点时默认树的状态为不展开
            	    child.setState("closed");
            	//只将叶子节点及有子节点的节点存入
            	if(menu.getIntLevel()==0||(menu.getIntLevel()==1&&(childList!=null&&childList.size()>0)))
            	rootList.add(child); //将节点放入List数组中
    		}
    	}
    	return rootList;
    }
    
    /**
     * 开发人： andy
     * 开发时间： 2013-10-26 下午04:58:30
     * 功能描述：打开菜单所具有的操作功能的页面，以便提供用户进行权限功能选择
     * 方法的参数和返回值
     * @return
     * @throws AppException
     * String 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    @SuppressWarnings("unchecked")
	public String openOptListPage()throws AppException{
    	String menuId = getParameter("menuId");
    	List<SysMenuOperations> optList = (List<SysMenuOperations>) this.baselogic.searchByHql("from SysMenuOperations po where po.vcDelFlag=0 and po.vcMenuId='"+menuId+"' order by po.nseq asc");
        List<TreeNode> optList2 = DbUtil.executeSqlQuery("select op_sname,op_note from Sys_T_Menu$Lib l where l.vc_url in (select m.vc_url from sys_t_menu m where m.vc_id='"+
        		this.getParameter("menuId")+"') order by op_Seq",TreeNode.mapper2);
    	String memo = DbUtil.getFirstStringSqlQuery("select vc_memo from sys_t_menu where vc_id=?",new Object[]{menuId});
    	if(StringUtil.isNotBlank(memo)){
    		SysMenuOperations opt = new SysMenuOperations();
    		opt.setVcSimpleName("conf");
    		opt.setVcName("参数配置");
    		optList.add(opt);
    		optList2.add(new TreeNode("conf","拥有此权限后可以配置模块中的注册表参数及公共字典项"));
    	}
        setAttribute("optList", optList);
        JSONArray ary = new JSONArray();
        ary.addAll(optList2);
        setAttribute("ops", ary.toString());
    	return "menuOptPage";
    }


	@Override
	protected String addItem() throws AppException {
		// TODO Auto-generated method stub
		this.initVcId();
		SysRole role = (SysRole)this.po;
		//设置用户ID
		if(!User.getUser().isSuperUser()) {
		    role.setVcType(User.getUserId());
		}
		
		String[] menuids = this.getParameter("menuIds").split(",");
		HashMap<String, String> opts = new HashMap<String, String>();
		for(int i=0;i<menuids.length;i++){
			if(this.getParameter("chooseOpt"+menuids[i])!=null) //存在用户没有选择菜单功能操作的情况，因此需要判断
			  opts.put(menuids[i], this.getParameter("chooseOpt"+menuids[i]).toString());
		}	
		this.roleLogic.addRole(role, menuids, opts);
		return this.list();
	}


	@Override
	protected String delItem() throws AppException {
		// TODO Auto-generated method stub
		String[] delIds = this.getParameterValues(WebConstants.SELECT_ITEMS_NAMES);
		if(delIds==null||delIds.length==0){
			throw new AppException("没有选择要删除的记录");
		}
		this.roleLogic.deleteRole(delIds);
		return this.searchData();
	}


	@Override
	protected String modifyItem() throws AppException {
		// TODO Auto-generated method stub
		SysRole role = (SysRole)this.po;
		if(!User.getUser().isSuperUser()) {
		    role.setVcType(User.getUserId());
		}
		String[] menuids = this.getParameter("menuIds").split(",");
		HashMap<String, String> opts = new HashMap<String, String>();
		for(int i=0;i<menuids.length;i++){
			if(this.getParameter("chooseOpt"+menuids[i])!=null) //存在用户没有选择菜单功能操作的情况，因此需要判断
			  opts.put(menuids[i], this.getParameter("chooseOpt"+menuids[i]).toString());
		}	
		this.roleLogic.updateRole(role, menuids, opts);
		return this.searchData();
	}


	@Override
	protected String openModifyPage() throws AppException {
		//获取当前角色的菜单管理权限
		List<?> rolePermissList = this.baselogic.searchByHql("from SysRolePermiss po where po.vcRoleId='"+this.getSelectId()+"'");
		setAttribute("rolePermissList", rolePermissList);
		String res = super.openModifyPage();
		if(User.getUser().isAdmin()){
			SysRole p = (SysRole) po;
			String zgry = OrgUtil.getUserName(p.getVcType());
			setAttribute("zgry", zgry);
		}
		if(User.getUser().isSuperUser()) {
			this.setAttribute("isAdmin", "true");
		}
		return res;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-10-28 上午10:10:09
	 * 功能描述：更改用户状态操作，由于需要进行按钮的权限控制，此处统一通过名为relation的方法进行统一操作功能转向
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String relation() throws AppException{
		if("openRelationUserPage".equals(getParameter("user_op")))
			return this.openRelationUserPage();
		else if("saveRelationUser".equals(getParameter("user_op")))
			return this.saveRelationUser();
		return null;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-10-28 下午04:07:46
	 * 功能描述：打开选取用户界面
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String openUserListPage()throws AppException{
        List<?> userList = this.baselogic.searchByHql("from SysPerson po where po.vcOrgId='"+this.getParameter("orgId")+"' and po.vcDelFlag = 0 and vcStatus = 1");
        setAttribute("userList", userList);
		return "chooseUserForRelation";
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-10-28 下午04:08:01
	 * 功能描述：打开账号关联管理界面
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	private String openRelationUserPage()throws AppException{
		//将关联账号中的人员全部获取，然后将人员id以,号分隔传递到前台
		List<?> roleAccounts = this.baselogic.searchByHql("from SysAccountRole po where po.vcRoleId = '"+this.getParameter("roleId")+"'");
		String userids = "";
		Iterator<?> it = roleAccounts.iterator();
		while(it.hasNext()){
			SysAccountRole role = (SysAccountRole)it.next();
			userids = userids + role.getVcUserId()+",";
		}
		if(StringUtil.isNotBlank(userids))
			userids = userids.substring(0, userids.length()-1);
		setAttribute("userids", userids);
		return "relationUserPage";
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-10-28 下午04:08:27
	 * 功能描述：保存角色关联账号
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	private String saveRelationUser()throws AppException{
		try{
			this.roleLogic.addRelation(this.getParameter("roleId"),this.getParameter("userids"));//保存关联账号
		}catch(Exception e){
		   super.returnInfoForJS(false, e.getMessage());	
		}
		super.returnInfoForJS(true, null);
		return null;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-10-28 下午04:28:15
	 * 功能描述：查看某个角色下的所有账号
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String viewRelationUser()throws AppException{
		String sql = "select orgname,VC_NAME,VC_LOG$NAME,VC_STATUS from (" +
				"select t.*,p.VC_NAME as orgname from sys_t_person t, sys_v_org$dep p where t.vc_org$id = p.VC_ID(+)" +
				" and t.vc_id in (select r.vc_user$id from sys_t_account$role r where r.vc_role$id = '"+this.getParameter("roleId")+"')" +
				") person where person.vc_del$flag = 0 order by orgname";
		List<?> userList = this.baselogic.executeSQLQuery(sql, new ISQLMapper<Object>(){
			public SysPersonView fromSQLQuery(ResultSet rs, int num) {
				SysPersonView view = new SysPersonView();
				try {
					view.setVcOrgId(rs.getString("orgname"));
					view.setVcName(rs.getString("VC_NAME"));
					view.setVcLogName(rs.getString("VC_LOG$NAME"));		
					view.setVcStatus(rs.getInt("VC_STATUS"));
				} catch (SQLException e) {
					
					e.printStackTrace();
				}
				return view;
			}
		});
		setAttribute("userList", userList);
		return "viewRoleUserList";
	}
/**
 * 
  * 开发人： shoucai.wang
  * 开发时间： 2013-10-18 上午9:40:02
  * 功能描述：获取权限列表中主管人员
  * 方法的参数和返回值
  * @return String
  * List 
  * ==================================
  * 修改历史
  * 修改人        修改时间      修改原因及内容
  *
  * ==================================
 */
    public String searchAdminUsers() throws AppException{
	List<String> adminUserList = new ArrayList<String>();
	String sql = "SELECT nvl(p.vc_name,'管理员') vc_user_name"
		+ "   FROM SYS_T_ROLE t,SYS_T_PERSON p"
		+ "   WHERE t.VC_DEL$FLAG = 0"
		+ "   AND t.vc_type = p.vc_id(+)" + "   group by p.vc_name";
	adminUserList = DbUtil.executeStringSqlQuery(sql);
	StringBuffer op = new StringBuffer(""+":"+"");
	if (!adminUserList.isEmpty() && adminUserList.size() > 0) {
	    for (String str : adminUserList) {
		op.append("," + str + ":"+str);
	    }
	}
	return writeHTML(op.toString());
    }
}

